library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────── tidyverse 1.3.1 ──
✔ ggplot2 3.3.6     ✔ purrr   0.3.4
✔ tibble  3.1.7     ✔ dplyr   1.0.9
✔ tidyr   1.2.0     ✔ stringr 1.4.0
✔ readr   2.1.2     ✔ forcats 0.5.1
── Conflicts ────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(scales)

Attaching package: ‘scales’

The following object is masked from ‘package:purrr’:

    discard

The following object is masked from ‘package:readr’:

    col_factor
library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(lubridate)

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union

Covid Tab

#loads in beds and add year column
beds <- read_csv("raw_data/non_covid_raw_data/beds_by_nhs_board_of_treatment_and_specialty.csv") %>% janitor::clean_names()

beds %>% 
mutate(date = yq(quarter),
         year = year(date))
# bed percentage availablity for "all acute"
# Will need to add filter for year based on user input
beds_plotly <- beds %>%
  filter(specialty_name == "All Acute") %>% 
  group_by(quarter, specialty_name) %>%
  summarise(mean_perc_occ = mean(percentage_occupancy)) %>% 
  ggplot(aes(x = quarter, y = mean_perc_occ))+
  geom_line(aes(colour = specialty_name, group = specialty_name))+
  geom_point()+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))+
  labs(title = "Mean bed availability for all Acute Patients",
       x = "\nYear and Quarter",
       y = "Average Percentage Occupancy")
`summarise()` has grouped output by 'quarter'. You can override using the `.groups` argument.
ggplotly(beds_plotly) %>% config(displayModeBar = FALSE)
NA
NA

##Scotland Shapefile #### ae_wait_times wrangling

ae_wait_times <- read_csv("raw_data/non_covid_raw_data/monthly_ae_waitingtimes_202206.csv") %>% janitor::clean_names()
Rows: 15837 Columns: 25── Column specification ──────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (13): Country, HBT, TreatmentLocation, DepartmentType, NumberOfAttendancesEpisodeQF, N...
dbl (12): Month, NumberOfAttendancesAggregate, NumberOfAttendancesEpisode, NumberMeetingTa...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#glimpse(ae_wait_times)


#make a date and year column with the first date of every month
ae_wait_times <- ae_wait_times %>% 
  mutate(date = ym(month), .after = month,
         year = year(date))

#make a percent column with percent of patients meeting the 4hr target time
ae_wait_times <- ae_wait_times %>% 
  mutate(percent_4hr_target_achieved = (number_meeting_target_aggregate/number_of_attendances_aggregate)*100)

target_2007 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2007) %>% 
  rename(ae_target_2007 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2007)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2008 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2008) %>% 
  rename(ae_target_2008 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2008)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2009 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2009) %>% 
  rename(ae_target_2009 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2009)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2010 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2010) %>% 
  rename(ae_target_2010 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2010)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2011 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2011) %>% 
  rename(ae_target_2011 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2011)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2012 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2012) %>% 
  rename(ae_target_2012 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2012)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2013 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2013) %>% 
  rename(ae_target_2013 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2013)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2014 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2014) %>% 
  rename(ae_target_2014 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2014)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2015 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2015) %>% 
  rename(ae_target_2015 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2015)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2016 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2016) %>% 
  rename(ae_target_2016 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2016)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2017 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2017) %>% 
  rename(ae_target_2017 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2017)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2018 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2018) %>% 
  rename(ae_target_2018 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2018)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2019 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2019) %>% 
  rename(ae_target_2019 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2019)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2020 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2020) %>% 
  rename(ae_target_2020 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2020)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
target_2021 <- ae_wait_times %>%
  group_by(year, hbt) %>% 
  summarise(ae_4hr_target_achieved = mean(percent_4hr_target_achieved, na.rm = TRUE)) %>% 
  filter(year == 2021) %>% 
  rename(ae_target_2021 = ae_4hr_target_achieved) %>% 
  ungroup() %>% 
  select(hbt,ae_target_2021)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
  

shape file wrangling

scotland <- st_read("../SG_NHS_HealthBoards_2019_shapefile/SG_NHS_HealthBoards_2019.shp")
Reading layer `SG_NHS_HealthBoards_2019' from data source 
  `C:\Users\neilp\Documents\CODECLAN\phs_scotland_group_project\SG_NHS_HealthBoards_2019_shapefile\SG_NHS_HealthBoards_2019.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 14 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 5512.998 ymin: 530250.8 xmax: 470332 ymax: 1220302
Projected CRS: OSGB 1936 / British National Grid
# make a smaller version for performance issues
scotland_smaller <- scotland %>% 
  st_simplify(TRUE, dTolerance = 2000)
#fixes problems caused by above 
scotland_smaller <- sf::st_cast(scotland_smaller, "MULTIPOLYGON")

#add in the A&E 4 hr target data for each year
scotland_smaller <-  scotland_smaller %>% 
  mutate(centres = st_centroid(st_make_valid(geometry))) %>%
    mutate(lat = st_coordinates(centres)[,1],
           long = st_coordinates(centres)[,2],
           target_2007 = target_2007$ae_target_2007,
           target_2008 = target_2008$ae_target_2008,
           target_2009 = target_2009$ae_target_2009,
           target_2010 = target_2010$ae_target_2010,
           target_2011 = target_2011$ae_target_2011,
           target_2012 = target_2012$ae_target_2012,
           target_2013 = target_2013$ae_target_2013,
           target_2014 = target_2014$ae_target_2014,
           target_2015 = target_2015$ae_target_2015,
           target_2016 = target_2016$ae_target_2016,
           target_2017 = target_2017$ae_target_2017,
           target_2018 = target_2018$ae_target_2018,
           target_2019 = target_2019$ae_target_2019,
           target_2020 = target_2020$ae_target_2020,
           target_2021 = target_2021$ae_target_2021
                  )

# ggplot(data = scotland_smaller) +
#   geom_sf(aes(fill = target_2018)) + # will need to change this filter depending on a drop down
#   scale_fill_viridis_c(option = "plasma")+
#   theme_void()+
#   labs(title = "Percent of A&E depts making the 4hr target")


p <- ggplot(scotland_smaller) + 
  geom_sf(aes(fill = target_2018, 
              text = paste("<b>", HBName, "</b>\n", round(target_2018, digits = 2),"%", sep = ""))) + 
  scale_fill_viridis_c(option = "plasma", name = "4Hr A&E Target %")+
  theme_void()+
  labs(title = "Percent of A&E depts making the 4hr target")
Warning: Ignoring unknown aesthetics: text
p %>%
  ggplotly(tooltip = "text") %>%
  style(hoverlabel = list(bgcolor = "white"), hoveron = "fill")%>% 
  config(displayModeBar = FALSE)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc2YpDQpgYGANCg0KDQoNCiMjIENvdmlkIFRhYg0KYGBge3J9DQojbG9hZHMgaW4gYmVkcyBhbmQgYWRkIHllYXIgY29sdW1uDQpiZWRzIDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9ub25fY292aWRfcmF3X2RhdGEvYmVkc19ieV9uaHNfYm9hcmRfb2ZfdHJlYXRtZW50X2FuZF9zcGVjaWFsdHkuY3N2IikgJT4lIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0KYmVkcyAlPiUgDQptdXRhdGUoZGF0ZSA9IHlxKHF1YXJ0ZXIpLA0KICAgICAgICAgeWVhciA9IHllYXIoZGF0ZSkpDQpgYGANCg0KDQpgYGB7cn0NCiMgYmVkIHBlcmNlbnRhZ2UgYXZhaWxhYmxpdHkgZm9yICJhbGwgYWN1dGUiDQojIFdpbGwgbmVlZCB0byBhZGQgZmlsdGVyIGZvciB5ZWFyIGJhc2VkIG9uIHVzZXIgaW5wdXQNCmJlZHNfcGxvdGx5IDwtIGJlZHMgJT4lDQogIGZpbHRlcihzcGVjaWFsdHlfbmFtZSA9PSAiQWxsIEFjdXRlIikgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBzcGVjaWFsdHlfbmFtZSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3BlcmNfb2NjID0gbWVhbihwZXJjZW50YWdlX29jY3VwYW5jeSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcXVhcnRlciwgeSA9IG1lYW5fcGVyY19vY2MpKSsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBzcGVjaWFsdHlfbmFtZSwgZ3JvdXAgPSBzcGVjaWFsdHlfbmFtZSkpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpKw0KICBsYWJzKHRpdGxlID0gIk1lYW4gYmVkIGF2YWlsYWJpbGl0eSBmb3IgYWxsIEFjdXRlIFBhdGllbnRzIiwNCiAgICAgICB4ID0gIlxuWWVhciBhbmQgUXVhcnRlciIsDQogICAgICAgeSA9ICJBdmVyYWdlIFBlcmNlbnRhZ2UgT2NjdXBhbmN5IikNCg0KZ2dwbG90bHkoYmVkc19wbG90bHkpICU+JSBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkNCiAgDQoNCmBgYA0KDQojI1Njb3RsYW5kIFNoYXBlZmlsZQ0KIyMjIyBhZV93YWl0X3RpbWVzIHdyYW5nbGluZw0KYGBge3J9DQphZV93YWl0X3RpbWVzIDwtIHJlYWRfY3N2KCJyYXdfZGF0YS9ub25fY292aWRfcmF3X2RhdGEvbW9udGhseV9hZV93YWl0aW5ndGltZXNfMjAyMjA2LmNzdiIpICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpDQoNCiNnbGltcHNlKGFlX3dhaXRfdGltZXMpDQoNCg0KI21ha2UgYSBkYXRlIGFuZCB5ZWFyIGNvbHVtbiB3aXRoIHRoZSBmaXJzdCBkYXRlIG9mIGV2ZXJ5IG1vbnRoDQphZV93YWl0X3RpbWVzIDwtIGFlX3dhaXRfdGltZXMgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltKG1vbnRoKSwgLmFmdGVyID0gbW9udGgsDQogICAgICAgICB5ZWFyID0geWVhcihkYXRlKSkNCg0KI21ha2UgYSBwZXJjZW50IGNvbHVtbiB3aXRoIHBlcmNlbnQgb2YgcGF0aWVudHMgbWVldGluZyB0aGUgNGhyIHRhcmdldCB0aW1lDQphZV93YWl0X3RpbWVzIDwtIGFlX3dhaXRfdGltZXMgJT4lIA0KICBtdXRhdGUocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkID0gKG51bWJlcl9tZWV0aW5nX3RhcmdldF9hZ2dyZWdhdGUvbnVtYmVyX29mX2F0dGVuZGFuY2VzX2FnZ3JlZ2F0ZSkqMTAwKQ0KDQp0YXJnZXRfMjAwNyA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDA3KSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAwNyA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAwNykNCg0KdGFyZ2V0XzIwMDggPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gbWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAwOCkgJT4lIA0KICByZW5hbWUoYWVfdGFyZ2V0XzIwMDggPSBhZV80aHJfdGFyZ2V0X2FjaGlldmVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChoYnQsYWVfdGFyZ2V0XzIwMDgpDQoNCnRhcmdldF8yMDA5IDwtIGFlX3dhaXRfdGltZXMgJT4lDQogIGdyb3VwX2J5KHllYXIsIGhidCkgJT4lIA0KICBzdW1tYXJpc2UoYWVfNGhyX3RhcmdldF9hY2hpZXZlZCA9IG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMDkpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDA5ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDA5KQ0KDQp0YXJnZXRfMjAxMCA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDEwKSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxMCA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxMCkNCg0KdGFyZ2V0XzIwMTEgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gbWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAxMSkgJT4lIA0KICByZW5hbWUoYWVfdGFyZ2V0XzIwMTEgPSBhZV80aHJfdGFyZ2V0X2FjaGlldmVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChoYnQsYWVfdGFyZ2V0XzIwMTEpDQoNCnRhcmdldF8yMDEyIDwtIGFlX3dhaXRfdGltZXMgJT4lDQogIGdyb3VwX2J5KHllYXIsIGhidCkgJT4lIA0KICBzdW1tYXJpc2UoYWVfNGhyX3RhcmdldF9hY2hpZXZlZCA9IG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTIpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDEyID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDEyKQ0KDQp0YXJnZXRfMjAxMyA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDEzKSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxMyA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxMykNCg0KdGFyZ2V0XzIwMTQgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gbWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAxNCkgJT4lIA0KICByZW5hbWUoYWVfdGFyZ2V0XzIwMTQgPSBhZV80aHJfdGFyZ2V0X2FjaGlldmVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChoYnQsYWVfdGFyZ2V0XzIwMTQpDQoNCnRhcmdldF8yMDE1IDwtIGFlX3dhaXRfdGltZXMgJT4lDQogIGdyb3VwX2J5KHllYXIsIGhidCkgJT4lIA0KICBzdW1tYXJpc2UoYWVfNGhyX3RhcmdldF9hY2hpZXZlZCA9IG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTUpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE1ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE1KQ0KDQp0YXJnZXRfMjAxNiA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDE2KSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxNiA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxNikNCg0KdGFyZ2V0XzIwMTcgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gbWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAxNykgJT4lIA0KICByZW5hbWUoYWVfdGFyZ2V0XzIwMTcgPSBhZV80aHJfdGFyZ2V0X2FjaGlldmVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChoYnQsYWVfdGFyZ2V0XzIwMTcpDQoNCnRhcmdldF8yMDE4IDwtIGFlX3dhaXRfdGltZXMgJT4lDQogIGdyb3VwX2J5KHllYXIsIGhidCkgJT4lIA0KICBzdW1tYXJpc2UoYWVfNGhyX3RhcmdldF9hY2hpZXZlZCA9IG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDE4ID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDE4KQ0KDQp0YXJnZXRfMjAxOSA8LSBhZV93YWl0X3RpbWVzICU+JQ0KICBncm91cF9ieSh5ZWFyLCBoYnQpICU+JSANCiAgc3VtbWFyaXNlKGFlXzRocl90YXJnZXRfYWNoaWV2ZWQgPSBtZWFuKHBlcmNlbnRfNGhyX3RhcmdldF9hY2hpZXZlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUgDQogIHJlbmFtZShhZV90YXJnZXRfMjAxOSA9IGFlXzRocl90YXJnZXRfYWNoaWV2ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2VsZWN0KGhidCxhZV90YXJnZXRfMjAxOSkNCg0KdGFyZ2V0XzIwMjAgPC0gYWVfd2FpdF90aW1lcyAlPiUNCiAgZ3JvdXBfYnkoeWVhciwgaGJ0KSAlPiUgDQogIHN1bW1hcmlzZShhZV80aHJfdGFyZ2V0X2FjaGlldmVkID0gbWVhbihwZXJjZW50XzRocl90YXJnZXRfYWNoaWV2ZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMCkgJT4lIA0KICByZW5hbWUoYWVfdGFyZ2V0XzIwMjAgPSBhZV80aHJfdGFyZ2V0X2FjaGlldmVkKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChoYnQsYWVfdGFyZ2V0XzIwMjApDQoNCnRhcmdldF8yMDIxIDwtIGFlX3dhaXRfdGltZXMgJT4lDQogIGdyb3VwX2J5KHllYXIsIGhidCkgJT4lIA0KICBzdW1tYXJpc2UoYWVfNGhyX3RhcmdldF9hY2hpZXZlZCA9IG1lYW4ocGVyY2VudF80aHJfdGFyZ2V0X2FjaGlldmVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgcmVuYW1lKGFlX3RhcmdldF8yMDIxID0gYWVfNGhyX3RhcmdldF9hY2hpZXZlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoaGJ0LGFlX3RhcmdldF8yMDIxKQ0KICANCmBgYA0KDQojIyMjIHNoYXBlIGZpbGUgd3JhbmdsaW5nDQpgYGB7cn0NCnNjb3RsYW5kIDwtIHN0X3JlYWQoIi4uL1NHX05IU19IZWFsdGhCb2FyZHNfMjAxOV9zaGFwZWZpbGUvU0dfTkhTX0hlYWx0aEJvYXJkc18yMDE5LnNocCIpDQoNCiMgbWFrZSBhIHNtYWxsZXIgdmVyc2lvbiBmb3IgcGVyZm9ybWFuY2UgaXNzdWVzDQpzY290bGFuZF9zbWFsbGVyIDwtIHNjb3RsYW5kICU+JSANCiAgc3Rfc2ltcGxpZnkoVFJVRSwgZFRvbGVyYW5jZSA9IDIwMDApDQojZml4ZXMgcHJvYmxlbXMgY2F1c2VkIGJ5IGFib3ZlIA0Kc2NvdGxhbmRfc21hbGxlciA8LSBzZjo6c3RfY2FzdChzY290bGFuZF9zbWFsbGVyLCAiTVVMVElQT0xZR09OIikNCg0KI2FkZCBpbiB0aGUgQSZFIDQgaHIgdGFyZ2V0IGRhdGEgZm9yIGVhY2ggeWVhcg0Kc2NvdGxhbmRfc21hbGxlciA8LSAgc2NvdGxhbmRfc21hbGxlciAlPiUgDQogIG11dGF0ZShjZW50cmVzID0gc3RfY2VudHJvaWQoc3RfbWFrZV92YWxpZChnZW9tZXRyeSkpKSAlPiUNCiAgICBtdXRhdGUobGF0ID0gc3RfY29vcmRpbmF0ZXMoY2VudHJlcylbLDFdLA0KICAgICAgICAgICBsb25nID0gc3RfY29vcmRpbmF0ZXMoY2VudHJlcylbLDJdLA0KICAgICAgICAgICB0YXJnZXRfMjAwNyA9IHRhcmdldF8yMDA3JGFlX3RhcmdldF8yMDA3LA0KICAgICAgICAgICB0YXJnZXRfMjAwOCA9IHRhcmdldF8yMDA4JGFlX3RhcmdldF8yMDA4LA0KICAgICAgICAgICB0YXJnZXRfMjAwOSA9IHRhcmdldF8yMDA5JGFlX3RhcmdldF8yMDA5LA0KICAgICAgICAgICB0YXJnZXRfMjAxMCA9IHRhcmdldF8yMDEwJGFlX3RhcmdldF8yMDEwLA0KICAgICAgICAgICB0YXJnZXRfMjAxMSA9IHRhcmdldF8yMDExJGFlX3RhcmdldF8yMDExLA0KICAgICAgICAgICB0YXJnZXRfMjAxMiA9IHRhcmdldF8yMDEyJGFlX3RhcmdldF8yMDEyLA0KICAgICAgICAgICB0YXJnZXRfMjAxMyA9IHRhcmdldF8yMDEzJGFlX3RhcmdldF8yMDEzLA0KICAgICAgICAgICB0YXJnZXRfMjAxNCA9IHRhcmdldF8yMDE0JGFlX3RhcmdldF8yMDE0LA0KICAgICAgICAgICB0YXJnZXRfMjAxNSA9IHRhcmdldF8yMDE1JGFlX3RhcmdldF8yMDE1LA0KICAgICAgICAgICB0YXJnZXRfMjAxNiA9IHRhcmdldF8yMDE2JGFlX3RhcmdldF8yMDE2LA0KICAgICAgICAgICB0YXJnZXRfMjAxNyA9IHRhcmdldF8yMDE3JGFlX3RhcmdldF8yMDE3LA0KICAgICAgICAgICB0YXJnZXRfMjAxOCA9IHRhcmdldF8yMDE4JGFlX3RhcmdldF8yMDE4LA0KICAgICAgICAgICB0YXJnZXRfMjAxOSA9IHRhcmdldF8yMDE5JGFlX3RhcmdldF8yMDE5LA0KICAgICAgICAgICB0YXJnZXRfMjAyMCA9IHRhcmdldF8yMDIwJGFlX3RhcmdldF8yMDIwLA0KICAgICAgICAgICB0YXJnZXRfMjAyMSA9IHRhcmdldF8yMDIxJGFlX3RhcmdldF8yMDIxDQogICAgICAgICAgICAgICAgICApDQoNCiMgZ2dwbG90KGRhdGEgPSBzY290bGFuZF9zbWFsbGVyKSArDQojICAgZ2VvbV9zZihhZXMoZmlsbCA9IHRhcmdldF8yMDE4KSkgKyAjIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhpcyBmaWx0ZXIgZGVwZW5kaW5nIG9uIGEgZHJvcCBkb3duDQojICAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIpKw0KIyAgIHRoZW1lX3ZvaWQoKSsNCiMgICBsYWJzKHRpdGxlID0gIlBlcmNlbnQgb2YgQSZFIGRlcHRzIG1ha2luZyB0aGUgNGhyIHRhcmdldCIpDQoNCg0KcCA8LSBnZ3Bsb3Qoc2NvdGxhbmRfc21hbGxlcikgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHRhcmdldF8yMDE4LCANCiAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlKCI8Yj4iLCBIQk5hbWUsICI8L2I+XG4iLCByb3VuZCh0YXJnZXRfMjAxOCwgZGlnaXRzID0gMiksIiUiLCBzZXAgPSAiIikpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIiwgbmFtZSA9ICI0SHIgQSZFIFRhcmdldCAlIikrDQogIHRoZW1lX3ZvaWQoKSsNCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50IG9mIEEmRSBkZXB0cyBtYWtpbmcgdGhlIDRociB0YXJnZXQiKQ0KDQpwICU+JQ0KICBnZ3Bsb3RseSh0b29sdGlwID0gInRleHQiKSAlPiUNCiAgc3R5bGUoaG92ZXJsYWJlbCA9IGxpc3QoYmdjb2xvciA9ICJ3aGl0ZSIpLCBob3Zlcm9uID0gImZpbGwiKSU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpDQpgYGANCg0KDQoNCg0KDQo=